import axios from "axios";
import { getRefreshToken } from "../api/user";
import store from "../store/index";
import { ElMessage } from "element-plus";
import NProgress from "nprogress"; // 引入NProgress 当然，要提前npm下载一下:npm i nprogress
import "nprogress/nprogress.css"; // 引入NProgress和对应的样式
NProgress.configure({ showSpinner: false }); // 隐藏右侧的旋转进度条
const api = axios.create({
  baseURL: "/api",
  // baseURL: import.meta.env.VITE_API_BASEURL,
  timeout: 1000,
});

//请求拦截器
api.interceptors.request.use(
  (config) => {
    NProgress.start(); //请求条开启
    //获取toekn
    const token = store.state.user?.token;
    if (token) {
      //携带Authorization
      config.headers.Authorization = token;
    }
    return config;
  },
  (err) => {
    return Promise.reject(err);
  }
);

//响应拦截器
api.interceptors.response.use(
  //2xx状态码
  (res) => {
    const { data } = res;
    if (data.code === 1000) {
      NProgress.done(); // 关闭进度条
      return data.data;
    } else {
      NProgress.done(); // 关闭进度条
      //业务失败,抛出错误
      ElMessage.error(data.message);
    }
  },
  //非2xx状态码
  async (error) => {
    //根据HTTP状态码来处理不同的业务逻辑
    let response = error?.response;
    if (!response) {
      //如果获取不到数据,就自定义一个,防止报错
      response = {
        status: 500,
        data: {
          message: "网络请求失败,请刷新后重试",
        },
      };
    }
    //  1.获取到HTTP状态码
    const { status } = response;
    //  2.获取中文的错误描述
    const { message } = response.data;
    //  3.switch
    if (status === 401 && !error.config.url.includes("refreshToken")) {
      //status:401表示token过期,调用刷新token的接口
      try {
        const result = await getRefreshToken();
        //刷新成功将新token写入本地
        console.log(result);
        store.commit("user/setToken", result.token);
        //重新请求接口
        const newApi = await api(error.config);
        return newApi;
      } catch (error) {
        //刷新token的token过期了,跳转登录界面
        // //没有权限
        ElMessage.error(message);
        store.dispatch("user/loginout", false);
        sessionStorage.clear();
        // location.reload();
        return Promise.reject(error);
      }
    }
    NProgress.done(); // 关闭进度条
    return Promise.reject(error);
  }
);

export default api;
